package model

import (
	"miomp-terminal-suite/backend/app/common"
	"miomp-terminal-suite/backend/constant"
	"miomp-terminal-suite/backend/global"
	"time"
)

type IdModuleCounter struct {
	Module  string `json:"module"`
	Step    int64  `json:"step"`
	Counter int64  `json:"counter"`
}

// ListAllIdModuleCounter
func ListAllIdModuleCounter() ([]*IdModuleCounter, error) {

	var idModuleCounterArray = make([]*IdModuleCounter, 0)

	keyArray, err := global.CACHE.PrefixScanKey(constant.PREFIX_COMMON_ID_GENERATOR_MODULE)
	if err != nil {
		return nil, new(common.ResError).WithBiz(common.BizResourceNotExist)
	}

	if len(keyArray) == 0 {
		idModuleCounter, err := AddIdModuleCounter("default")
		if err != nil {
			return nil, new(common.ResError).WithBiz(common.BizSystemError)
		}
		idModuleCounterArray = append(idModuleCounterArray, idModuleCounter)

	} else {
		for _, cacheKey := range keyArray {
			idModuleCounter := new(IdModuleCounter)
			err := global.CACHE.Get(cacheKey, idModuleCounter)
			if err != nil {
				continue
			}
			idModuleCounterArray = append(idModuleCounterArray, idModuleCounter)
		}
	}

	return idModuleCounterArray, nil
}

// GetIdModuleCounter
func GetIdModuleCounter(module string) (*IdModuleCounter, error) {

	cacheKeyModule := constant.PREFIX_COMMON_ID_GENERATOR_MODULE + module
	idModuleCounter := new(IdModuleCounter)
	err := global.CACHE.Get(cacheKeyModule, idModuleCounter)
	if err != nil {
		// 不存在
		return nil, new(common.ResError).WithBiz(common.BizResourceNotExist)
	}

	return idModuleCounter, nil
}

// AddIdModuleCounter
func AddIdModuleCounter(module string) (*IdModuleCounter, error) {

	cacheKeyModule := constant.PREFIX_COMMON_ID_GENERATOR_MODULE + module
	idModuleCounter := new(IdModuleCounter)
	err := global.CACHE.Get(cacheKeyModule, idModuleCounter)
	if err != nil {
		// 说明不存在, 新增一个
		idModuleCounterInsert := new(IdModuleCounter)
		idModuleCounterInsert.Module = module
		idModuleCounterInsert.Counter = time.Now().UnixMilli() * 100
		idModuleCounterInsert.Step = 400

		err = global.CACHE.Set(cacheKeyModule, idModuleCounterInsert)
		if err != nil {
			return nil, err
		}

		return idModuleCounterInsert, nil
	}

	return idModuleCounter, nil

}

// UpdateIdModuleCounter
func UpdateIdModuleCounter(idModuleCounter *IdModuleCounter) error {

	cacheKeyModule := constant.PREFIX_COMMON_ID_GENERATOR_MODULE + idModuleCounter.Module

	err := global.CACHE.Set(cacheKeyModule, idModuleCounter)
	if err != nil {
		return err
	}

	return nil
}
